lexer grammar Analexlexer;

options {
  language = Java;
}

@header {
  package practpl.siete;
}

@members {
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
}

INCLUDE: ALMOHADILLA 'include';
DEFINE: ALMOHADILLA 'define';
DOUBLE: 'double';
IF: 'if';
ELSE: 'else';
WHILE: 'while';
CHAR: 'char';
FOR: 'for';
BREAK: 'break';
RETURN: 'return';
TOKEN: 'token';
START: 'start';
TYPE: 'type';
UNION: 'union';
LEFT: 'left';
INTERVAL: 'interval'|'INTERVAL';

N: 'n';
CARACTER: COMILLASIMPLE (LETRAMAY|LETRAMIN|PUNTO) COMILLASIMPLE;

fragment NUEVA_LINEA: ('\r\n'|'\n');
BLANCO: (' '|'\t'|NUEVA_LINEA) {skip();};

PUNTO: '.';
PUNTOCOMA: ';';
COMA: ',';
COLON: ':';

MAS: '+';
MENOS: '-';
MULT: '*';
DIV: '/';

fragment DIGITO: '0'..'9';
NUMERO : (DIGITO)+ ('.' (DIGITO)+)?;
GUIONBAJO: '_';

fragment LETRAMAY: ('A'..'Z');
fragment LETRAMIN: ('a'..'z');
//NO_TERMINAL: (LETRAMIN)(LETRAMIN|GUIONBAJO)*;
IDENT: (LETRAMAY|LETRAMIN|GUIONBAJO)((DIGITO)|(LETRAMAY|LETRAMIN))*;
ALGO: (PUNTO|LETRAMAY|LETRAMIN|DIGITO|MENOS|MULT)*;

CADENA: '"' (.)* '"';

BARRA: '\\';
COMILLASIMPLE: '\'';

SEPARADOR: '%%';
ABRE_DCC: '%{';
CIERRA_DCC: '%}';
PORCENTAJE: '%';

ALMOHADILLA: '#';
DOLAR: '$';
MAYOR: '>';
MENOR: '<';
IGUAL: '=';
OR: '|';
MENORIGUAL: '<=';
MAYORIGUAL: '>=';
COMPARA: '==';
DISTINTO: '!=';

AND: '&&';
OR2: '||';

LLAVEA: '{';
LLAVEC: '}';
PARENTA: '(';
PARENTC:')';
CORCHETEA: '[';
CORCHETEC: ']';

LIBRERIA : MENOR (LETRAMIN)+ '.h' MAYOR;
ETIQUETA: MENOR IDENT MAYOR;

COMENTARIO: '/*' (.)* '*/' {skip();};

